﻿namespace Digitalmes.Domain.Entities.Mes.Productions;

/// <summary>
/// 产品当前生产状态信息。
/// </summary>
[SugarTable("prod_transform")]
public sealed class ProdTransform : EntityBase
{
    /// <summary>
    /// SN
    /// </summary>
    [NotNull]
    public string? Sn { get; set; }

    /// <summary>
    /// 产品 Id。
    /// </summary>
    public long ProductId { get; set; }

    /// <summary>
    /// 产品编码
    /// </summary>
    [NotNull]
    public string? ProductCode { get; set; }

    /// <summary>
    /// 工单编号
    /// </summary>
    public string? Wo { get; set; }

    /// <summary>
    /// 当前生产线 Id
    /// </summary>
    public long CurLineId { get; set; }

    /// <summary>
    /// 当前所在的产线编号。
    /// </summary>
    [NotNull]
    public string? CurLineCode { get; set; }

    /// <summary>
    /// 当前工艺路线 Id。
    /// </summary>
    public long CurRouteId { get; set; }

    /// <summary>
    /// 当前所在的工艺路线编号。
    /// </summary>
    [NotNull]
    public string? CurRouteCode { get; set; }

    /// <summary>
    /// 当前工序 Id。
    /// </summary>
    public long CurOpId { get; set; }

    /// <summary>
    /// 当前工序编号
    /// </summary>
    [NotNull]
    public string? CurOpCode { get; set; }

    /// <summary>
    /// 当前工位 Id。
    /// </summary>
    public long CurWsId { get; set; }

    /// <summary>
    /// 当前工位编号
    /// </summary>
    [NotNull]
    public string? CurWsCode { get; set; }

    /// <summary>
    /// 产品在当前工位进站时间
    /// </summary>
    public DateTime? InboundTime { get; set; }

    /// <summary>
    /// 产品在当前工位出站时间
    /// </summary>
    public DateTime? OutboundTime { get; set; }

    /// <summary>
    /// 产品上线时间
    /// </summary>
    /// <remarks>根据工艺路线，起始工位进站时间</remarks>
    public DateTime OnlineTime { get; set; }

    /// <summary>
    /// 产品下线时间
    /// </summary>
    /// <remarks>根据工艺路线，末尾工位出站时间，若是 NG 或报废，更加具体情况设置</remarks>
    public DateTime? OfflineTime { get; set; }

    /// <summary>
    /// 当前处于阶段（进站/出站）。
    /// </summary>
    /// <remarks>
    /// 上件或下件等工位，可能只有出站状态。
    /// </remarks>
    public int Stage { get; set; }

    /// <summary>
    /// 当前产品作业状态（1->OK，2->NG，3->强制OK，4->强制NG）
    /// </summary>
    public PassEnum Status { get; set; }

    /// <summary>
    /// 是否已完工下线。
    /// </summary>
    /// <remarks>
    /// 若是已在工艺路线中的尾部工位且 OK 下件，即为完工状态；
    /// 或是人为设置为完工状态，如根据条件，返修后不再上线，直接完工。
    /// </remarks>
    public bool IsCompelted { get; set; }

    /// <summary>
    /// 子码集合（JSON数组）。
    /// </summary>
    /// <remarks>
    /// 在合流阶段，该零件码做为主追溯码，其他子物料就作为子主追溯码。
    /// </remarks>
    [NotNull]
    [SugarColumn(IsJson = true)]
    public List<long>? Children { get; set; } = [];

    /// <summary>
    /// 客户条码。
    /// </summary>
    public string? CustomerSn { get; set; }

    /// <summary>
    /// 返工次数。
    /// </summary>
    /// <remarks>可根据计算一次合格率。</remarks>
    public int ReworkCount { get; set; }

    /// <summary>
    /// NG的起始工步
    /// </summary>
    public long FailedStep { get; set; }

    /// <summary>
    /// 数据更新时间
    /// </summary>
    public DateTime UpdatedTime { get; set; }
}
